<!--
 * @Date: 2022-01-27 12:43:09
 * @LastEditTime: 2022-01-28 22:46:18
-->
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <script>
        // 1. 执行成功 但是 时间复杂度很高 利用对象的方法
        // var isValidSudoku = function (board) {
        //     let col = {}
        //     let row = {}
        //     let box = {}
        //     for (var i = 0; i < board.length; i++) {
        //         for (var j = 0; j < board[i].length; j++) {
        //             let num = board[i][j];
        //             if (num !== '.') {
        //                 let boxindex = Math.floor(i / 3) * 3 + Math.floor(j / 3)
        //                 if (col[i + '' + num] || row[j + '' + num] || box[boxindex + '' + num]) {
        //                     return false
        //                 }
        //                 col[i + '' + num] = true;
        //                 row[j + '' + num] = true;
        //                 box[boxindex + '' + num] = true;
        //                 debugger
        //             }
        //         }
        //     }
        //     return true
        // }
        // var arr2 = [
        //     ["5", "3", ".", ".", "7", ".", ".", ".", "."],
        //     ["6", ".", ".", "1", "9", "5", ".", ".", "."],
        //     [".", "9", "8", ".", ".", ".", ".", "6", "."],
        //     ["8", ".", ".", ".", "6", ".", ".", ".", "3"],
        //     ["4", ".", ".", "8", ".", "3", ".", ".", "1"],
        //     ["7", ".", ".", ".", "2", ".", ".", ".", "6"],
        //     [".", "6", ".", ".", ".", ".", "2", "8", "."],
        //     [".", ".", ".", "4", "1", "9", ".", ".", "5"],
        //     [".", ".", ".", ".", "8", ".", ".", "7", "9"]]
        // var arr = [
        //     ["1", ".", ".", ".", ".", ".", ".", ".", "."],
        //     ["2", ".", ".", "1", ".", ".", ".", ".", "."],
        //     [".", ".", ".", ".", ".", ".", ".", ".", "."],
        //     [".", ".", ".", ".", ".", ".", ".", ".", "."],
        //     [".", ".", ".", ".", ".", ".", ".", ".", "."],
        //     [".", ".", ".", ".", ".", ".", ".", ".", "."],
        //     [".", ".", ".", ".", ".", ".", ".", ".", "."],
        //     [".", ".", ".", ".", ".", ".", ".", ".", "."],
        //     [".", ".", ".", ".", ".", ".", ".", ".", "."]
        // ]
        // console.log(isValidSudoku(arr2));


        // 2. 利用数组来存储

        // 这个方法时间复杂度很好
       var fArr =  [
        [".",".",".",".","5",".",".","1","."],
        [".","4",".","3",".",".",".",".","."],
        [".",".",".",".",".","3",".",".","1"],
        ["8",".",".",".",".",".",".","2","."],
        [".",".","2",".","7",".",".",".","."],
        [".","1","5",".",".",".",".",".","."],
        [".",".",".",".",".","2",".",".","."],
        [".","2",".","9",".",".",".",".","."],
        [".",".","4",".",".",".",".",".","."]
    ]

    var fArr2 = [
        ["5","3",".",".","7",".",".",".","."],
        ["6",".",".","1","9","5",".",".","."],
        [".","9","8",".",".",".",".","6","."],
        ["8",".",".",".","6",".",".",".","3"],
        ["4",".",".","8",".","3",".",".","1"],
        ["7",".",".",".","2",".",".",".","6"],
        [".","6",".",".",".",".","2","8","."],
        [".",".",".","4","1","9",".",".","5"],
        [".",".",".",".","8",".",".","7","9"]
    ]
        // 思考：73 行 只要有一个不是点号 就可以判断 一个不是点 另一个是点 肯定无法相等
        // arr4 是个bug
        var isValidSudoku = function (board) {
            var flag = 0;
            // 行和列的比较
            // 三层for循环 z + 1
            for (var i = 0; i < 9; i++) {
                for (var j = 0; j < 9; j++) {
                    for (var z = j + 1; z < 9; z++) {
                        // 行 上的元素比较 第一个都是i表示都一行
                        if (board[i][j] != '.' && board[i][j] === board[i][z]) {
                            flag = 1;
                            console.log("行相同");
                            return false
                        }
                        // 列 上的元素比较 第二个都是i表示都一列
                        if (board[j][i] != '.' && board[j][i] === board[z][i]) {
                            flag = 1;
                            console.log("列相同");
                            return false
                        }
                    }
                }
            }

            // 九宫格内部判断
            for (var row = 0; row < 9; row += 3) {
                for (var col = 0; col < 9; col += 3) {
                    var num = []
                    for (var a = row; a < row + 3; a++) {
                        for (var b = col; b < col + 3; b++) {
                            // 如果数字不是点进行判断
                            if (board[a][b] !== ".") {
                                // 数放到 num数组里面去
                                num.push(board[a][b])
                            }
                        }
                    }
                    
                    // 上面的逻辑是把数组里面所有的元素放到num数组
                    // 下面的逻辑是判断数组里面是否有重复的元素
                    // 这个for和上面的a处的for并列 表示 一个宫格内部判断 判断完毕就去下一个宫格
                    for (var x = 0; x < num.length; x++) {
                        for (var y = x + 1; y < num.length; y++) {
                            if (num[x] === num[y]) {
                                flag = 1;
                                console.log(num[x]);
                                console.log(num[y]);
                                console.log("宫格内相同");
                                return false
                            }
                        }
                    }
                }

            }
            if (flag === 0) {
                    return true
                }
        }
        console.log(isValidSudoku(fArr));
        console.log(isValidSudoku(fArr2));
    </script>
</body>

</html>